package com.booter.common;

import com.fasterxml.jackson.core.type.TypeReference;
import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;


/**
 * @author xueqiu
 * @date 2024/1/19 11:07
 */
public class CustomizedTypeReference<T> extends TypeReference<T> {
    protected final Type type;

    //不停的new ParameterizedTypeImpl 可能会造成内存泄露,把Type用ConcurrentHashMap缓存起来
    protected <T> CustomizedTypeReference(Class<T> cls) {
        Type type = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        ParameterizedTypeImpl clsInfo = ParameterizedTypeImpl.make(((ParameterizedTypeImpl) type).getRawType(), new Type[]{cls}, null);
        this.type = clsInfo;
    }

    protected CustomizedTypeReference() {
        Type superClass = getClass().getGenericSuperclass();
        if (superClass instanceof Class<?>) { // sanity check, should never happen
            throw new IllegalArgumentException("Internal error: TypeReference constructed without actual type information");
        }
        this.type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
    }

    @Override
    public Type getType() {
        return type;
    }


//ParameterizedType
//返回表示此类型实际类型参数的 Type 对象的数组。
//注意，在某些情况下，返回的数组为空。如果此类型表示嵌套在参数化类型中的非参数化类型，则会发生这种情况。
//    Type[] getActualTypeArguments();
//    //返回 Type 对象，表示此类型是其成员之一的类型。
//    Type getOwnerType();
//    //返回 Type 对象，表示声明此类型的类或接口。
//    Type getRawType();

}
